package ar.uba.fi.tecnicas.fabrica;

import java.util.*;
import ar.uba.fi.tecnicas.fabrica.MateriaPrima; 

public class Almacen 
{
	public final static Almacen instancia =  new Almacen();

	private Map<TipoMateriaPrima, MateriaPrima> materiasPrimas = null;
	
	private Almacen() 
	{
		this.materiasPrimas = new HashMap<TipoMateriaPrima, MateriaPrima>();
	}
	
	public void agregarNuevaMateriaPrima(MateriaPrima materiaPrima) 
	{
		this.materiasPrimas.put(materiaPrima.getTipo(), materiaPrima);
	}
	
	public boolean existeEnAlmacen(TipoMateriaPrima tipo) 
	{
		return this.materiasPrimas.keySet().contains(tipo);
	}
	
	public void aumentarCantidadEnStock(TipoMateriaPrima tipo, double cantidad) 
	{
		this.materiasPrimas.get(tipo).aumentarCantidad(cantidad);
	}
	
	public boolean cantidadSuficiente(TipoMateriaPrima tipo, float cantRequerida) 
	{
		boolean haySuficiente;
		
		haySuficiente = this.materiasPrimas.get(tipo).tieneSuficiente(cantRequerida);
		
		return haySuficiente;
	}
	
	public MateriaPrima getFraccion(TipoMateriaPrima tipo, double cantidad) 
	{
		MateriaPrima materiaPrimaObtenida = this.materiasPrimas.get(tipo);
		MateriaPrima materiaPrima = null;
				
		if (materiaPrimaObtenida.tieneSuficiente(cantidad))
		{
			materiaPrima = this.materiasPrimas.get(tipo).disminuirCantidad(cantidad);
		}
		if (materiaPrimaObtenida.getCantidad() == 0)
		{
			this.materiasPrimas.remove(tipo);
		}
		return materiaPrima;	
	}

	public Collection<MateriaPrima> getMateriasPrimas() 
	{
		return this.materiasPrimas.values();
	}

	public MateriaPrima getMateriaPrima(TipoMateriaPrima tipo) 
	{
		return this.materiasPrimas.get(tipo);
	}
	
}
